package com.example.distributelock.controller;

import com.example.distributelock.lock.RedisLock;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * @author caryguan
 * @version V1.0
 * @Package com.example.distributelock.controller
 * @date 2020/10/8 21:23
 */
@RestController
@Slf4j
public class RedisLockController {

    @Autowired
    private RedisTemplate redisTemplate;
    //因为我们释放锁也需要使用则两个变量,所以提取到外边
    String key = "redisKey";
    //保证所有线程本地资源持有值唯一可以使用UUID
    String value = UUID.randomUUID().toString();

    @RequestMapping("redisLock")
    public String redisLock() {
        log.info("我进入了方法!!");


        //在try括号里加锁,方法结束后会自动释放
        try (RedisLock redisLock = new RedisLock(redisTemplate, "redisKey", 30)) {
            if (redisLock.getLock())
                log.info("我进入了锁!");
            Thread.sleep(15000);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //我们使用的新特性自动关闭就不用再finally写了
        //  finally {
        //     boolean result = redisLock.unLock();
        //     log.info("释放锁的结果:" + result);
        //
        // }

        log.info("方法执行完成");
        return "方法执行完成";
    }

}